package br.com.pucrs.tcc.controller;

import java.util.ArrayList;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import br.com.pucrs.tcc.ed.Professor;
import br.com.pucrs.tcc.rn.AlocacaoRN;
import br.com.pucrs.tcc.rn.GrupoTrabalhoRN;
import br.com.pucrs.tcc.rn.ProfessorRN;
import br.com.pucrs.tcc.util.jsf.MensagemUtil;
import br.com.pucrs.tcc.util.jsf.PaginaUtil;
import br.com.pucrs.tcc.util.jsf.ParametroPagina;
import br.com.pucrs.tcc.vo.GrupoAlocacao;
import br.com.pucrs.tcc.vo.GrupoAlocado;
import br.com.pucrs.tcc.vo.TotaisAlocacao;

@ManagedBean(name = "AlocacaoBean")
@ViewScoped
public class AlocacaoBean {

	private boolean podeAlocar;

	private TotaisAlocacao totais;

	private ArrayList<GrupoAlocacao> grupos;

	private ArrayList<Professor> professores;

	@EJB
	private GrupoTrabalhoRN mGrupoTrabalhoRN;

	@EJB
	private ProfessorRN mProfessorRN;

	@EJB
	private AlocacaoRN mAlocacaoRN;

	public AlocacaoBean() {
		totais = new TotaisAlocacao();
		grupos = new ArrayList<GrupoAlocacao>();
		podeAlocar = true;
	}

	@PostConstruct
	public void carregaDados() {
		totais = mAlocacaoRN.buscarTotais();

		professores = (ArrayList<Professor>) mProfessorRN.listaPossiveisOrientadores();
		
		for (Professor p : professores) {
			p.setCargaHoraria(mProfessorRN.obterCargaHoraria(p));
		}	
	}

	public void doAlocar() {

		try {
			grupos = mAlocacaoRN.realizarAlocacao();

			totais = mAlocacaoRN.buscarTotais();
			
			for (Professor p : professores) {
				p.setCargaHoraria(mProfessorRN.obterCargaHoraria(p));
			}			
		}
		catch (Exception e) {
			MensagemUtil.mostraMensagemErro(e.getMessage());
			e.printStackTrace();
		}
	}

	public void doEditar() {

		try {

			ArrayList<ParametroPagina> parametros = new ArrayList<ParametroPagina>();

			PaginaUtil.redirecionar("/pages/distribuicao_editar.xhtml", parametros);
		} catch (Exception e) {
			MensagemUtil.mostraMensagemFatal("Problema ao listar areas de interesse. Por favor tente mais tarde.");
			e.printStackTrace();
		}
	}
	

	public boolean isPodeAlocar() {
		return podeAlocar;
	}

	public void setPodeAlocar(boolean podeAlocar) {
		this.podeAlocar = podeAlocar;
	}

	public TotaisAlocacao getTotais() {
		return totais;
	}

	public void setTotais(TotaisAlocacao totais) {
		this.totais = totais;
	}

	public ArrayList<GrupoAlocacao> getGrupos() {
		return grupos;
	}

	public void setGrupos(ArrayList<GrupoAlocacao> grupos) {
		this.grupos = grupos;
	}

	public ArrayList<Professor> getProfessores() {
		return professores;
	}

	public void setProfessores(ArrayList<Professor> professores) {
		this.professores = professores;
	}

}
